Software testing generally pertains to determining whether software functions correctly. More specifically, software testing is a process of locating and reporting defects (a.k.a. bugs) and ensuring the defects are fixed by generating and executing tests on software. In other words, testing is a cyclic workflow including running generated tests and fixing defects. As a result, testing can improve the quality and reliability of software.
Testing can be performed at various times in a development process. Traditionally, software is coded in accordance with a design and subsequently tested toward the end of the development process just prior to release. Newer development models often utilize test-driven development, which involves generating tests prior to authoring code. As a result, development is focused on producing code that passes tests defining failure conditions for new or improved functionality. Of course, a combination of these and other approaches can be employed such that testing can occur at any time in the development process. For example, code can be written and tested incrementally by a developer.
Several different types of testing can be employed at various points in a development process including unit testing, integration testing, system testing, and acceptance testing. Unit testing involves determining whether individual units of source code work properly, wherein a unit is the smallest testable portion of code (e.g., modules, classes, functions . . . ). Integration testing involves testing groups of units. System testing goes a step further and seeks to validate an entire software application. Finally, acceptance testing seeks to exercise the application with real data (e.g., customer data).